home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
SUB.C
< prev
next >
Wrap
Text File
|
2000-03-29
|
5KB
|
231 lines
/*
* スプライトその他の処理をする関数群
*/
#include <stdio.h>
#include <doslib.h>
#include <iocslib.h>
#include <io.h>
#include "SPASSION.H"
#include "ENTRY.H"
#include "BG.H"
#include "SOUND.H"
#include "SUB.H"
/*
* スペースキー入力を待つ
*/
void key_wait()
{
void game_end();
while( BITSNS(0x06) & BIT(0x05) ); /* 離されるまで待つ */
while(!(BITSNS(0x06) & BIT(0x05))) /* 押されるまで待つ */
if( BITSNS(0x00) & BIT(0x01) )game_end(); /* ESCが押されたら END */
while( BITSNS(0x06) & BIT(0x05) ); /* 離されるまで待つ */
}
/*
* joy stick & キー入力ルーチン
*/
char GetKey( short num ,short button_swap )
{
int k;
char s=0, s1=0;
s = ~JOYGET( num );
k = BITSNS( 8 );
if( k & 0x10 )s |= KEY_UP;
if( k & 0x80 )s |= KEY_LEFT;
k = BITSNS( 9 );
if( k & 0x02 )s |= KEY_RIGHT;
if( k & 0x10 )s |= KEY_DOWN;
k = BITSNS( 14 );
if( !button_swap ){
if( k & 0x08 )
s |= A_BUTTON;
if( k & 0x04 )
s |= B_BUTTON;
return s;
}else{
/* A B ボタン入れ換え */
s1 = (s&0x0F); /* キーだけ */
if( k & 0x08 || s & A_BUTTON )
s1 |= B_BUTTON;
if( k & 0x04 || s & B_BUTTON )
s1 |= A_BUTTON;
return s1;
}
return s;
}
/*
* joy stick & キー入力ルーチン(メニュー用)
*/
char GetKeyM( short num )
{
int k;
char s = 0;
s = ~JOYGET( num );
k = BITSNS( 8 );
if( k & 0x10 )s |= KEY_UP;
if( k & 0x80 )s |= KEY_LEFT;
k = BITSNS( 9 );
if( k & 0x02 )s |= KEY_RIGHT;
if( k & 0x10 )s |= KEY_DOWN;
k = BITSNS( 14 );
if( k & 0x08 )
s |= A_BUTTON;
if( k & 0x04 )
s |= B_BUTTON;
return s;
}
void InitMapData( void )
{
extern unsigned short bg_map1[32 * 32 * 6];
extern unsigned short bg_map2[32 * 32 * 6];
extern unsigned short bg_map3[32 * 32 * 6];
extern unsigned short bg_map4[32 * 32 * 6];
bg_map[0]=&bg_map1[0];
bg_map[1]=&bg_map2[0];
bg_map[2]=&bg_map3[0];
bg_map[3]=&bg_map4[0];
/* マップデータ読み込み */
LoadFile("BG/STAGE01.SP", &bg_sp[0][0], sizeof (char), 32 * 256);
LoadFile("BG/STAGE01.PAL", &bg_pal[0][0], sizeof (short), 16 );
LoadFile("BG/STAGE02.SP", &bg_sp[1][0], sizeof (char), 32 * 256);
LoadFile("BG/STAGE02.PAL", &bg_pal[1][0], sizeof (short), 16 );
LoadFile("BG/STAGE03.SP", &bg_sp[2][0], sizeof (char), 32 * 256);
LoadFile("BG/STAGE03.PAL", &bg_pal[2][0], sizeof (short), 16 );
LoadFile("BG/STAGE04.SP", &bg_sp[3][0], sizeof (char), 32 * 256);
LoadFile("BG/STAGE04.PAL", &bg_pal[3][0], sizeof (short), 16 );
}
void Init( void )
{
void LoadXSPFile( void );
void InitXSP( void );
void InitSound( void );
void InitShot0( void );
void InitEShot0( void );
void InitEnemyHit( void );
OS_CUROF();
CRTMOD( 16 ); /* 768*512dot 16色 グラフィックプレーン1枚 31kHz */
G_CLR_ON();
MS_CUROF(); /* マウスカーソルを消す */
printf("Please Wait...\n");
/* 角度のテーブルを読み込む */
LoadFile( "TBL/ANGLE.TBL", angle_tbl, sizeof (unsigned char), 256*256 );
/* 角度毎の速度のテーブルを読み込む */
LoadFile( "TBL/VXTABLE.TBL", vx_tbl, sizeof (signed int), 256 * SPEED_MAX );
LoadFile( "TBL/VYTABLE.TBL", vy_tbl, sizeof (signed int), 256 * SPEED_MAX );
LoadFile ("TBL/PT_ROT.TBL", pt_rot, sizeof (short), 256);
LoadFile ("TBL/INFO_ROT.TBL", info_rot, sizeof (short), 256);
LoadFile ("TBL/RNDTABLE.TBL", rndtable, sizeof (unsigned char), 256);
/*敵エントリーデータ読み込み*/
LoadFile("ST_DAT/STAGE01.DAT", &stage_data[0][0], sizeof (ENTRY), ENTRY_MAX);
LoadFile("ST_DAT/STAGE02.DAT", &stage_data[1][0], sizeof (ENTRY), ENTRY_MAX);
LoadFile("ST_DAT/STAGE03.DAT", &stage_data[2][0], sizeof (ENTRY), ENTRY_MAX);
LoadFile("ST_DAT/STAGE04.DAT", &stage_data[3][0], sizeof (ENTRY), ENTRY_MAX);
game_state=!IN_TITLE;
SUPER(0);
InitSound();
LoadXSPFile();
InitMapData();
InitShot0();
InitEShot0();
InitEnemyHit();
InitEntry();
CRTMOD( 10 ); /* 256*256dot 256色 グラフィックプレーン1枚 31kHz */
G_CLR_ON();
MS_CUROF(); /* マウスカーソルを消す */
SKEY_MOD(0,0,0);
*(unsigned short *) 0xe82500 = 0b01001001001110; /* 優先順位 TX>SP>GR */
InitXSP();
}
/* ファイル読み込み */
/* 読み込みに失敗した場合はいきなり終了するので注意 */
int LoadFile (char *fname, void *ptr, int size, int n)
{
FILE *fp;
int i;
void game_end( void );
if ((fp = fopen (fname, "rb")) == NULL) {
static char e[256];
error_level = ERROR_FILE;
error_message = e;
sprintf(e, "\nファイル %s が読み込めません\n"
"強制終了します。\n"
, fname);
game_end();
}
i = fread (ptr, size, n, fp);
fclose (fp);
return (i); /* 返り値は読み込み項目数 */
}
/*
* (x1,y1)から見た(x2,y2)の向きを求める
* 返り値は、右回りに、
* 192
* 128 + 0
* 64 となる
*/
unsigned char calc_direction(short x1, short y1, short x2, short y2)
{
short dx = x2 - x1;
short dy = y2 - y1,dir=0;
/* 安全のため dx,dy 共に -255~255 の範囲に納める */
if (dx > 255) {
dx = 255;
} else {
if (dx < -255) {
dx = -255;
}
}
if (dy > 255) {
dy = 255;
} else {
if (dy < -255) {
dy = -255;
}
}
if (dx > 0) {
if (dy > 0) {
return (angle_tbl[dx][dy] + 64);
} else {
return (64 - angle_tbl[dx][-dy]);
}
} else {
if (dy > 0) {
return (192 - angle_tbl[-dx][dy]);
} else {
return (192 + angle_tbl[-dx][-dy]);
}
}
return dir;
}